package com.xzh.rxjava;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import org.reactivestreams.Subscriber;
import org.reactivestreams.Subscription;

import java.util.concurrent.TimeUnit;

import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.disposables.Disposable;
import io.reactivex.functions.Consumer;
import io.reactivex.functions.Function;
import io.reactivex.schedulers.Schedulers;

/**
 * 作者 ： xiezhihui on 2018\8\19 0019.
 * Q Q ： 347649749
 * 微信 ： LOVE347649749
 * 作用 ：按钮的倒计时，就像平时获取短信验证码的倒计时按钮。
 */

public class CountDownButtonActivity extends AppCompatActivity {

    private Button countDownBtn;
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_button_count_down_layout);
        countDownBtn = findViewById(R.id.count_down_btn);
    }

    public void onButtonClick(View view) {

        /**
         *  操作符interval ：作用是每过了多少秒就会执行一次Consumer的accept方法，并把值传过去
         *  这里的参数是: 参数1  执行一次延迟的时间   参数2  每次执行的时间间隔     参数3   执行时间的单位，这里是秒。
         *  take :  最大值只能是(count - 1), 也就是从0开始，执行count 次
         *  map :  转换，把顺数变成倒数
         *  observeOn : 让 Consumer 在子线程中执行
         *  doOnSubscribe : 这个方法在执行subscribe绑定之前执行，这里用来设置倒计时按钮点击的时候不可以在点击直到执行subScribe结束。
         *
         * **/
        final int count = 10;

        Observable.interval(0,1, TimeUnit.SECONDS)
                .take(count+1)
                .map(new Function<Long, Long>() {
                    @Override
                    public Long apply(Long aLong) throws Exception {
                        return count - aLong;
                    }
                })
                .doOnSubscribe(new Consumer<Disposable>() {
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        countDownBtn.setEnabled(false);
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Long>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Long aLong) {
                        countDownBtn.setText("倒计时剩余: "+aLong+" s ");
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onComplete() {
                        countDownBtn.setEnabled(true);
                        countDownBtn.setText("获取验证码");
                    }
                });
    }
}
